/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import sv.com.compassion.entidades.Beneficiario;
import sv.com.compassion.entidades.Nivelescolaridad;
import sv.com.compassion.entidades.Nota;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Clase para mantenimiento de Notas Finales . 
* @author grupo de Tesis
*/
public class NotaAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Nota nota;
    
    private String codBen;
    private String fecNot;
    private String idMat;
    private String idNiv;
    private String idCdi;
    private String VERhis;
    private String formaBus;
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad Nota. 
 */   
public NotaAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        nota = new Nota();
        
        nota.setIdBeneficiario(new Beneficiario());
        nota.setIdNivelEscolaridad(new Nivelescolaridad());

} 
/**
 * Busca el método que se ejecutara
 */ 
    @Override
    public String execute(){
        buscarMetodo(nota);        
        return null;
    }
 /**
 * @param objeto de la entidad Nota
 * Agrega las respectivas notas finales de un beneficiario, haciendo uso de la entidad Nota
 */       
    @Override    
    public void agregarEntidad(Object o) {
        Nota n;
        try{
            Date    date    =   new Date();
            n = (Nota)o;
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();
            
            setIdBeneficiario(n.getIdBeneficiario().getIdBeneficiario());
            setIdNivelEscolaridad(n.getIdNivelEscolaridad().getIdNivelEscolaridad());
            
            n.setAuAddUsr(Integer.parseInt(idUsuario));
            n.setAuAddDat(date);

            genericoDAO.save(n);
        }catch(Exception e){
            Logger.getLogger(NotaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Nota
 * Modifica el registro que se recibe de parámetro a inactivo (-1)
 */    
        @Override
    public void borrarEntidad(Object o) {
        List<Nota> listNota;
        Nota n;
        try{
            if(getId()!=null){
                listNota = genericoDAO.find("SELECT n FROM Nota n WHERE n.idNota = " + getId(), null, null);
                if(!listNota.isEmpty()){
                    n = listNota.get(0);
                    n.setEstNota(-1);
                    genericoDAO.update(n);
                }
            }            
        }catch(Exception e){
            Logger.getLogger(NotaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Nota
 * Modifica el registro que se recibe de parámetro estos valores se sobreescriben
 * al registro que ya se posee. 
 */          
    @Override
    public void editarEntidad(Object o) {
        Nota n;
        try{
            Date    date    =   new Date();
            n = (Nota)o;
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();
            
            n.setIdNota(new Integer(getId()));
            setIdBeneficiario(n.getIdBeneficiario().getIdBeneficiario());
            setIdNivelEscolaridad(n.getIdNivelEscolaridad().getIdNivelEscolaridad());

            setAuModUsr(Integer.parseInt(idUsuario));
            setAuModDat(date);
            
            genericoDAO.update(n);
        }catch(Exception e){
            Logger.getLogger(NotaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
    
 /**
 * Este método realiza las búsquedas de las notas previamente ingresadas, para llenar el grid del mantenimiento
 * esperando los filtros opcionales:
 *       codBen,
 *       fecNot,
 *       idNiv, 
 *       idCdi,
 *       VERhis
 */     
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
         
        List<Nota> listaNota = null;
        String query="";
        codBen = getRequest().getParameter("CodBen");
        fecNot = getRequest().getParameter("FecNot");
        idNiv = getRequest().getParameter("IdNiv");
        idCdi = getRequest().getParameter("IdCdi");
        VERhis = getRequest().getParameter("VERhis");
        formaBus = getRequest().getParameter("FormaBus");
        String codBenquery = "";
        String queryFecNot = "";
        String queryIdMat = "";
        String queryIdNiv = "";
        String queryIdCdi = "";
        String queryAux = "";
        if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            queryAux = "n.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "')) and ";
        }
        codBenquery = "n.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.codBeneficiario like upper('%" + codBen + "%')) ";
        if(!fecNot.equals("") || !idNiv.equals("") || !idCdi.equals("")){
            if(!fecNot.equals("")){
                queryFecNot = "and n.fecFinGrado = '" + fecNot + "' ";
            }
            if(!idNiv.equals("")){
               queryIdNiv = "and n.idNivelEscolaridad = '" + idNiv + "' ";
            }
            if(!idCdi.equals("")){
               queryIdCdi = "and n.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi ='" + idCdi + "') ";
            }
        }
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        try{
                if(getSearch()!= null && getSearch().equals("true")){
                    
                }else{
                    
                    query = "SELECT n FROM Nota n WHERE " +
                                queryAux + 
                                codBenquery +
                                queryFecNot +
                                queryIdMat +
                                queryIdNiv +
                                queryIdCdi +
                                "and (n.estNota like upper('" + verHistorial + "') or "
                                + "n.estNota like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY n.fecFinGrado " + getSord();
                }
                if(formaBus.equals("1")){ 
                }else{
                listaNota = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                query = "SELECT COUNT(n) FROM Nota n WHERE " +
                                queryAux + 
                                codBenquery +
                                queryFecNot +
                                queryIdMat +
                                queryIdNiv +
                                queryIdCdi +
                                "and (n.estNota like upper('" + verHistorial + "') or "
                                + "n.estNota like upper('" + verHistorialTemp + "'))";
                total = genericoDAO.countRow(query);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                List<RowsGrid> rows = new ArrayList<RowsGrid>();
                               
                for(Nota n: listaNota){
                    RowsGrid r = new RowsGrid(); 
                    r.setId(n.getIdNota().toString());
                    List cell = new ArrayList();
                    
                    cell.add(n.getIdBeneficiario().getCodBeneficiario());
                    cell.add(n.getIdBeneficiario().getIdBeneficiario());
                    
                    if(n.getEstNota() == 1){
                        cell.add("Activo");
                    }else{
                        cell.add("Inactivo");
                    }
                    
                    cell.add(n.getMatNota());
                    cell.add(n.getSocNota());
                    cell.add(n.getNatNota());
                    cell.add(n.getLenNota());
                                           
                    cell.add(n.getFecFinGrado().toString());
                    
                    cell.add(n.getIdNivelEscolaridad().getIdNivelEscolaridad());
                    cell.add(n.getIdNivelEscolaridad().getNomNivelEscolaridad());
                    
                    if(n.getAprobado() == 1){
                        cell.add("Si");
                    }else{
                        cell.add("No");
                    }
                       
                    cell.add(n.getAuAddUsr());
                    cell.add(n.getAuAddDat().toString());
                    
                    r.setCell(cell);
                    rows.add(r);
                }

                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
             }   
        }catch(Exception e){
            Logger.getLogger(NotaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }

    public Integer getIdNota() {
        return nota.getIdNota();
    }

    public void setIdNota(Integer idNota) {
        nota.setIdNota(idNota);
    }

    public String getFecFinGrado() {
        return Fecha.date2String(nota.getFecFinGrado());
    }

    public void setFecFinGrado(String fecFinGrado) {
        try {
            nota.setFecFinGrado(Fecha.string2Date(fecFinGrado));
        } catch (ParseException ex) {
            Logger.getLogger(NotaAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAprobado() {
        return nota.getAprobado();
    }

    public void setAprobado(int aprobado) {
        nota.setAprobado(aprobado);
    }

    public int getAuAddUsr() {
        return nota.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        nota.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(nota.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            if(auAddDat!=null && !auAddDat.equals("")){
                nota.setAuAddDat(Fecha.string2Date(auAddDat));
            }    
        } catch (ParseException ex) {
            Logger.getLogger(NotaAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return nota.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        nota.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return nota.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        nota.setAuModDat(auModDat);
    }

    public int getEstNota() {
        return nota.getEstNota();
    }

    public void setEstNota(int estNota) {
        nota.setEstNota(estNota);
    }

    public Integer getIdNivelEscolaridad() {
        return nota.getIdNivelEscolaridad().getIdNivelEscolaridad();
    }

    public void setIdNivelEscolaridad(Integer idNivelEscolaridad) {
        nota.getIdNivelEscolaridad().setIdNivelEscolaridad(idNivelEscolaridad);
    }

    public Integer getIdBeneficiario() {
        return nota.getIdBeneficiario().getIdBeneficiario();
    }

    public void setIdBeneficiario(Integer idBeneficiario) {
        nota.getIdBeneficiario().setIdBeneficiario(idBeneficiario);
    }

    public float getMatNota() {
        return nota.getMatNota();
    }

    public void setMatNota(float matNota) {
         nota.setMatNota(matNota);
    }
    
    public float getSocNota() {
        return nota.getSocNota();
    }

    public void setSocNota(float socNota) {
        nota.setSocNota(socNota);
    }

    public float getNatNota() {
        return nota.getNatNota();
    }

    public void setNatNota(float natNota) {
        nota.setNatNota(natNota);
    }

    public float getLenNota() {
        return nota.getLenNota();
    }

    public void setLenNota(float lenNota) {
        nota.setLenNota(lenNota);
    }
    
    @Override
    public void reporteXls() {
        HSSFWorkbook libro  = null;
        OutputStream out    = null;
        HttpServletResponse response = ServletActionContext.getResponse();
        
        try{
                out = response.getOutputStream();            

                // capturamos la direccion absoluta de la plantilla del reporte en el servidor 
            //    String path = getServlet().getServletContext().getRealPath("/xlt/reporteConsolidadoSMS.xlt");
                
                String ruta = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/reports/reportNotasFinales.xlt");
                FileInputStream stream = new FileInputStream(ruta); // obtenemos al archivo
                libro = new HSSFWorkbook(stream);      // el libro de trabajo

                response.setHeader("Pragma", "cache");          // Para mostrar ventana de apertura del archivo
                response.setContentType("application/ms-excel");
                response.setHeader("Content-Disposition","attachment;filename=reportNotasFinales.xls");
        
                libro = generarExcel(libro); 

                libro.write(out);
                out.flush();
                out.close();
        }catch(Exception e){
          e.printStackTrace();
        }         
    }
 /**
 * Método para desplegar el reporte de notas
 * esperando los filtros opcionales:
 *       codBen,
 *       fecNot,
 *       idNiv, 
 *       idCdi,
 *       VERhis
 *      @return  book ya completo con los datos que se desea expulsar
 */ 
  private HSSFWorkbook generarExcel(HSSFWorkbook book) {
          /**
     * EL ESTILO DEL REPORTE
     */
      HSSFCellStyle styleBordere = book.createCellStyle();
      HSSFFont fontReport = book.createFont();
      fontReport.setFontName("Arial");
      fontReport.setFontHeightInPoints((short)10);
      styleBordere.setFont(fontReport);
      styleBordere.setBorderBottom(styleBordere.BORDER_THIN);
      styleBordere.setBorderLeft(styleBordere.BORDER_THIN);
      styleBordere.setBorderRight(styleBordere.BORDER_THIN);
      styleBordere.setBorderTop(styleBordere.BORDER_THIN);
      styleBordere.setAlignment(HSSFCellStyle.ALIGN_CENTER);

      HSSFSheet sheet = book.getSheet("Hoja1"); //nombre de la hoja 
      HSSFRow row = sheet.getRow(1);
      HSSFCell celda = null;
      Date      today    =   new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy");
    //  String    ahora   =   ;
      row = sheet.createRow(3);
      celda = row.createCell(6);
      celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(today))));
      celda.setCellStyle(styleBordere);

      Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
         
        List<Nota> listaNota = null;
        String query="";
        codBen = getRequest().getParameter("CodBen");
        fecNot = getRequest().getParameter("FecNot");
        idNiv = getRequest().getParameter("IdNiv");
        idCdi = getRequest().getParameter("IdCdi");
        VERhis = getRequest().getParameter("VERhis");
        formaBus = getRequest().getParameter("FormaBus");
        String codBenquery = "";
        String queryFecNot = "";
        String queryIdMat = "";
        String queryIdNiv = "";
        String queryIdCdi = "";
        String queryAux = "";
        if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            queryAux = "n.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "')) and ";
        }
        codBenquery = "n.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.codBeneficiario like upper('%" + codBen + "%')) ";
        if(!fecNot.equals("") || !idNiv.equals("") || !idCdi.equals("")){
            if(!fecNot.equals("")){
                queryFecNot = "and n.fecFinGrado = '" + fecNot + "' ";
            }
            if(!idNiv.equals("")){
               queryIdNiv = "and n.idNivelEscolaridad = '" + idNiv + "' ";
            }
            if(!idCdi.equals("")){
               queryIdCdi = "and n.idBeneficiario IN (SELECT b FROM Beneficiario b WHERE b.idCdi ='" + idCdi + "') ";
            }
        }
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        
                    query = "SELECT n FROM Nota n WHERE " +
                                queryAux + 
                                codBenquery +
                                queryFecNot +
                                queryIdMat +
                                queryIdNiv +
                                queryIdCdi +
                                "and (n.estNota like upper('" + verHistorial + "') or "
                                + "n.estNota like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY n.fecFinGrado desc";
                
                listaNota = genericoDAO.find(query,null,null);
                
                int col   = 2;
                int fila  = 10;
                               
                for(Nota n: listaNota){
                    col   = 2;
                    row = sheet.createRow(fila);

                    celda = row.createCell(col++);
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(n.getIdBeneficiario().getCodBeneficiario())));
                    celda.setCellStyle(styleBordere);

                    celda = row.createCell(col++);
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(n.getIdNivelEscolaridad().getNomNivelEscolaridad())));
                    celda.setCellStyle(styleBordere);                        
                    
                    celda = row.createCell(col++);
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(n.getFecFinGrado()))));
                    celda.setCellStyle(styleBordere);     
                    
                    celda = row.createCell(col++);
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(n.getLenNota())));
                    celda.setCellStyle(styleBordere);  
                    
                    celda = row.createCell(col++);
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(n.getMatNota())));
                    celda.setCellStyle(styleBordere);
                    
                    celda = row.createCell(col++);
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(n.getNatNota())));
                    celda.setCellStyle(styleBordere);  
                    
                    celda = row.createCell(col++);
                    celda.setCellValue(new HSSFRichTextString(String.valueOf(n.getSocNota())));
                    celda.setCellStyle(styleBordere);  
                                       
                    fila++;

             }      
      return book;  
    }
    
            
}
